www.gusucode.com > VC++ 获取宽带ADSL的账号与密码程序 > VC++ 获取宽带ADSL的账号与密码程序/code/Dialupass.cpp
//Dialupass.cpp:implementation of the CDialupass class. // ////////////////////////////////////////////////////////////////////// #include"Dialupass.h" #include"until.h" #include<stdio.h> ////////////////////////////////////////////////////////////////////// //Construction/Destruction ////////////////////////////////////////////////////////////////////// //Download By http://www.newxing.com/ CDialupass::CDialupass(){ m_nMax=0; m_lpCurrentUser=GetCurrentLoginUser(); m_nRasCount=GetRasEntryCount(); m_PassWords=new PASSWORDS[m_nRasCount]; //OneInfo=new COneInfo*[m_nRasCount]; m_nUsed=0; m_nCount=0; GetRasEntries(); } CDialupass::~CDialupass(){ //for(int i=0;i<m_nRasCount;i++)delete[] OneInfo[i]; delete[] m_PassWords; if(m_lpCurrentUser)delete[] m_lpCurrentUser; } DWORD CDialupass::GetRasEntryCount(){ int nCount=0; LPTSTR lpPhoneBook[2]; TCHAR szPhoneBook1[MAX_PATH],szPhoneBook2[MAX_PATH]; if(!GetWindowsDirectory(szPhoneBook1,_countof(szPhoneBook1)))return 0; _tcscpy(_tcschr(szPhoneBook1,'\\')+1,_T("Documents and Settings\\")); _tcscat_s(szPhoneBook1,_countof(szPhoneBook1),m_lpCurrentUser); _tcscat_s(szPhoneBook1,_countof(szPhoneBook1),_T("\\Application Data\\Microsoft\\Network\\Connections\\pbk\\rasphone.pbk")); SHGetSpecialFolderPath(NULL,szPhoneBook2,0x23,0); wsprintf(szPhoneBook2,_T("%s\\%s"),szPhoneBook2,_T("Microsoft\\Network\\Connections\\pbk\\rasphone.pbk")); lpPhoneBook[0]=szPhoneBook1; lpPhoneBook[1]=szPhoneBook2; DWORD nSize=1024*4; LPTSTR lpszReturnBuffer=new TCHAR[nSize]; for(int i=0;i<_countof(lpPhoneBook);i++){ memset(lpszReturnBuffer,0,sizeof(lpszReturnBuffer)); DWORD ttt=GetPrivateProfileSectionNames(lpszReturnBuffer,nSize,lpPhoneBook[i]); for(LPTSTR lpSection=lpszReturnBuffer;*lpSection !='\0';lpSection+=_tcslen(lpSection)+1)nCount++; } delete[] lpszReturnBuffer; return nCount; } LPTSTR CDialupass::GetLocalSid(){ union{ SID s; TCHAR c[256]; }Sid; DWORD sizeSid=sizeof(Sid); DWORD sizeDomainName=256; TCHAR DomainName[256]; SID_NAME_USE peUse; LPTSTR pSid=NULL; if(!m_lpCurrentUser)return NULL; if(!LookupAccountName(NULL,m_lpCurrentUser,&Sid,&sizeSid,DomainName,&sizeDomainName,&peUse))return NULL; if(!IsValidSid(&Sid))return NULL; typedef BOOL (WINAPI*ConvertSid2StringSid)(PSID,LPTSTR*); ConvertSid2StringSid proc=0; HINSTANCE hLibrary=LoadLibrary(_T("advapi32.dll")); if(hLibrary){ #ifdef _UNICODE proc=(ConvertSid2StringSid)GetProcAddress(hLibrary,"ConvertSidToStringSidW"); #else proc=(ConvertSid2StringSid)GetProcAddress(hLibrary,"ConvertSidToStringSidA"); #endif if(proc){ proc(&Sid.s,&pSid); FreeLibrary(hLibrary); return pSid; }else{ FreeLibrary(hLibrary); return NULL; } } return NULL; } void CDialupass::StringToLsaStr(LPTSTR AValue,PLSA_UNICODE_STRING lsa){ #ifdef _UNICODE lsa->Length=_tcslen(AValue)*sizeof(TCHAR); lsa->MaximumLength=lsa->Length; lsa->Buffer=(PWSTR)malloc(lsa->MaximumLength*sizeof(TCHAR)); memcpy(lsa->Buffer,AValue,lsa->Length); #else DWORD dwSize=MultiByteToWideChar(CP_ACP,NULL,AValue,-1,NULL,NULL); lsa->Length=(dwSize-1)*2; lsa->MaximumLength=lsa->Length; lsa->Buffer=(LPWSTR)malloc(lsa->MaximumLength); MultiByteToWideChar(CP_ACP,NULL,AValue,_tcslen(AValue),lsa->Buffer,dwSize-1); #endif } PLSA_UNICODE_STRING CDialupass::GetLsaData(LPTSTR KeyName){ LSA_OBJECT_ATTRIBUTES LsaObjectAttribs; LSA_HANDLE LsaHandle; LSA_UNICODE_STRING LsaKeyName; NTSTATUS nts; PLSA_UNICODE_STRING OutData; ZeroMemory(&LsaObjectAttribs,sizeof(LsaObjectAttribs)); nts=LsaOpenPolicy(NULL,&LsaObjectAttribs,POLICY_GET_PRIVATE_INFORMATION,&LsaHandle); if(nts!=0)return NULL; StringToLsaStr(KeyName,&LsaKeyName); nts=LsaRetrievePrivateData(LsaHandle,&LsaKeyName,&OutData); free(LsaKeyName.Buffer); if(nts!=0)return NULL; nts=LsaClose(LsaHandle); if(nts!=0)return NULL; return OutData; } ///////// void CDialupass::ParseLsaBuffer(LPCWSTR Buffer,USHORT Length){ TCHAR AnsiPsw[1024]; #ifdef _UNICODE memcpy(AnsiPsw,Buffer,Length); #else WideCharToMultiByte(CP_ACP,0,Buffer,Length/2,AnsiPsw,_countof(AnsiPsw),0,0); //_tsetlocale(LC_ALL,_T(".936")); //wcstombs(AnsiPsw,Buffer,_countof(AnsiPsw)); #endif for(int i=0;i<Length/2-1;++i){ for(int j=0;j<10;++j){ switch(j){ case 0: _tcscpy(m_PassWords[m_nUsed].UID,AnsiPsw+i); break; case 5: _tcscpy(m_PassWords[m_nUsed].login,AnsiPsw+i); break; case 6: _tcscpy(m_PassWords[m_nUsed].pass,AnsiPsw+i); break; } i+=_tcslen(AnsiPsw+i)+1; } ++m_nUsed; } } /////////// void CDialupass::GetLsaPasswords(){ PLSA_UNICODE_STRING PrivateData; TCHAR Win2k[]=_T("RasDialParams!%s#0"); TCHAR WinXP[]=_T("L$_RasDefaultCredentials#0"); TCHAR temp[256]; wsprintf(temp,Win2k,GetLocalSid()); PrivateData=GetLsaData(temp); if(PrivateData){ ParseLsaBuffer(PrivateData->Buffer,PrivateData->Length); LsaFreeMemory(&PrivateData); } PrivateData=GetLsaData(WinXP); if(PrivateData){ ParseLsaBuffer(PrivateData->Buffer,PrivateData->Length); LsaFreeMemory(&PrivateData); } } bool CDialupass::GetRasEntries(){ int nCount=0; LPTSTR lpPhoneBook[2]; TCHAR szPhoneBook1[MAX_PATH+1],szPhoneBook2[MAX_PATH+1]; if(!GetWindowsDirectory(szPhoneBook1,_countof(szPhoneBook1)))return false; _tcscpy_s(szPhoneBook1,_countof(szPhoneBook1),_T("Documents and Settings\\")); _tcscat_s(szPhoneBook1,_countof(szPhoneBook1),m_lpCurrentUser); _tcscat_s(szPhoneBook1,_T("\\Application Data\\Microsoft\\Network\\Connections\\pbk\\rasphone.pbk")); SHGetSpecialFolderPath(NULL,szPhoneBook2,0x23,0); wsprintf(szPhoneBook2,_T("%s\\%s"),szPhoneBook2,_T("Microsoft\\Network\\Connections\\pbk\\rasphone.pbk")); lpPhoneBook[0]=szPhoneBook1; lpPhoneBook[1]=szPhoneBook2; OSVERSIONINFO osi; osi.dwOSVersionInfoSize=sizeof(OSVERSIONINFO); GetVersionEx(&osi); if(osi.dwPlatformId==VER_PLATFORM_WIN32_NT&&osi.dwMajorVersion>=5)GetLsaPasswords(); DWORD nSize=1024*4; LPTSTR lpszReturnBuffer=new TCHAR[nSize]; for(int i=0;i <_countof(lpPhoneBook);i++){ memset(lpszReturnBuffer,0,nSize); GetPrivateProfileSectionNames(lpszReturnBuffer,nSize,lpPhoneBook[i]); for(LPTSTR lpSection=lpszReturnBuffer;*lpSection !='\0';lpSection+=_tcslen(lpSection)+1){ LPTSTR lpRealSection=UTF8ToGB2312(lpSection); TCHAR strDialParamsUID[256]; TCHAR strUserName[256]; TCHAR strPassWord[256]; TCHAR strPhoneNumber[256]; TCHAR strDevice[256]; memset(strDialParamsUID,0,sizeof(strDialParamsUID)); memset(strUserName,0,sizeof(strUserName)); memset(strPassWord,0,sizeof(strPassWord)); memset(strPhoneNumber,0,sizeof(strPhoneNumber)); memset(strDevice,0,sizeof(strDevice)); int nBufferLen=GetPrivateProfileString(lpSection,_T("DialParamsUID"),0,strDialParamsUID,_countof(strDialParamsUID),lpPhoneBook[i]); if(nBufferLen>0){//DialParamsUID=4326020 198064 for(int j=0;j<m_nRasCount;j++){ if(_tcscmp(strDialParamsUID,m_PassWords[j].UID)==0){ _tcscpy(strUserName,m_PassWords[j].login); _tcscpy(strPassWord,m_PassWords[j].pass); m_PassWords[j].used=TRUE; m_nUsed++; break; } } } GetPrivateProfileString(lpSection,_T("PhoneNumber"),0,strPhoneNumber,256,lpPhoneBook[i]); GetPrivateProfileString(lpSection,_T("Device"),0,strDevice,256,lpPhoneBook[i]); LPTSTR lpRealDevice=UTF8ToGB2312(strDevice); LPTSTR lpRealUserName=UTF8ToGB2312(strUserName); Set(strDialParamsUID,lpRealSection,lpRealUserName,strPassWord,strPhoneNumber,lpRealDevice); delete[] lpRealSection; delete[] lpRealUserName; delete[] lpRealDevice; } } delete[] lpszReturnBuffer; return true; } BOOL CDialupass::Set(LPTSTR DialParamsUID,LPTSTR Name,LPTSTR User,LPTSTR Password,LPTSTR PhoneNumber,LPTSTR Device){ _tprintf(_T("Conn:%s\nUser:%s\nPass:%s\n"),Name,User,Password); return TRUE; } LPTSTR CDialupass::UTF8ToGB2312(LPTSTR UTF8Str){ #ifdef _UNICODE LPTSTR lpGBStr=new WCHAR[_tcslen(UTF8Str)+1]; wcscpy(lpGBStr,UTF8Str); return lpGBStr; #else if(UTF8Str==NULL||_tcslen(UTF8Str)==0){ LPTSTR nulstr=new TCHAR[1]; nulstr[0]=0; return nulstr; } int nStrLen=_tcslen(UTF8Str)+1; LPWSTR lpwcs=NULL; LPTSTR lpmbs=NULL; try{ lpwcs=new WCHAR[nStrLen]; lpmbs=new CHAR[nStrLen]; MultiByteToWideChar(CP_UTF8,0,UTF8Str,-1,lpwcs,nStrLen); WideCharToMultiByte(CP_ACP,0,lpwcs,-1,lpmbs,nStrLen,0,0); delete[] lpwcs; lpmbs[nStrLen-1]=0; return lpmbs; }catch (std::bad_alloc &ba){ if (lpwcs)delete[] lpwcs; return lpmbs; } #endif }